using System.Text;
using System.Collections.Generic;
using System.Data.Common;
using System.Data;
using System;
using System.ComponentModel;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Servico.Bovespa.Parametro.BusinessEntity.Enum;

namespace Sinacor.Servico.Bovespa.Parametro.ResourceAccess 
{
    public class ParametroBolsa : BaseResourceAccess 
    {
		public ParametroBolsa()
            : base(AuthorizationContext.Current.CompanyId)
        {
        }

		public void AlterarParametroBolsa(BusinessEntity.ParametroBolsa entity)        
        {
            StringBuilder sql = new StringBuilder();

            sql.Append("UPDATE TBOPARAM SET IN_ZERA_NOTA = :ZeraNota, ");
            sql.Append("NR_NOTA = :UltimaNotaEmitida, IN_NOTA = :NumeraNota, ");
            sql.Append("IN_GRUPA_NOTA = :AgrupaNota, IN_BASEIRLIQ = :BaseLiquido, ");
            sql.Append("IN_IRLIQNOT = :LiquidoNota, IN_CORRESPONDENTE = :Correspondente, ");
            sql.Append("IN_COMISSAO = :Comissao, IN_IROPER_LIQNOT = :SemOperacao, ");
            sql.Append("CD_MENSAGEM = :Mensagem, DS_CAMINHO_NOTA = :CaminhoNota, ");
            sql.Append("IN_CC = :IntegraContasCorrentes, IN_CS = :IntegraCustodia, ");
            sql.Append("IN_CT = :IntegraContabilidade, IND_INTR_TESO = :IntegraTesouraria, ");
            sql.Append("IN_INT_AGE_COMP = :EnviaAgente, IN_CART_PROP = :EnviaCarteira ");

            string _tipoZeraNota = Sinacor.Infra.Service.Common.EnumConverter.ToString<BusinessEntity.Enum.TipoPeriodo>(entity.ZeraNota);

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, ":IntegraContasCorrentes", DbType.String, entity.IntegraContasCorrentes ? "S" : "N");
                this.DataBase.AddInParameter(command, ":IntegraCustodia", DbType.String, entity.IntegraCustodia ? "S" : "N");
                this.DataBase.AddInParameter(command, ":IntegraContabilidade", DbType.String, entity.IntegraContabilidade ? "S" : "N");
                this.DataBase.AddInParameter(command, ":IntegraTesouraria", DbType.String, entity.IntegraTesouraria  ? "S" : "N");
                this.DataBase.AddInParameter(command, ":EnviaAgente", DbType.String, entity.EnviaAgente ? "S" : "N");
                this.DataBase.AddInParameter(command, ":EnviaCarteira", DbType.String, entity.EnviaCarteira ? "S" : "N");
            
                this.DataBase.AddInParameter(command, ":ZeraNota", DbType.String, _tipoZeraNota);
                this.DataBase.AddInParameter(command, ":UltimaNotaEmitida", DbType.Int32, entity.UltimaNotaEmitida);
                this.DataBase.AddInParameter(command, ":NumeraNota", DbType.String, entity.NumeraNota ? "S" : "N");
                this.DataBase.AddInParameter(command, ":AgrupaNota", DbType.String, entity.AgrupaNota ? "S" : "N");
                this.DataBase.AddInParameter(command, ":BaseLiquido", DbType.String, entity.BaseLiquido ? "S" : "N");
                this.DataBase.AddInParameter(command, ":LiquidoNota", DbType.String, entity.LiquidoNota ? "S" : "N");
                this.DataBase.AddInParameter(command, ":Correspondente", DbType.String, entity.Correspondente ? "S" : "N");
                this.DataBase.AddInParameter(command, ":Comissao", DbType.String, entity.Comissao ? "S" : "N");
                this.DataBase.AddInParameter(command, ":SemOperacao", DbType.String, entity.SemOperacao ? "S" : "N");
                this.DataBase.AddInParameter(command, ":Mensagem", DbType.String, entity.Mensagem);
                this.DataBase.AddInParameter(command, ":CaminhoNota", DbType.String, entity.CaminhoNota);

                this.DataBase.ExecuteNonQuery(command);
            }
		}

		public void AlterarTipoNota(BusinessEntity.TipoNota entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append("UPDATE TBOHIST_INTR_CCOR SET ");
            sql.Append("NR_HISCRE_AJUDT = :DayTradeDiaCredito, ");
            sql.Append("NR_HISDEB_AJUDT = :DayTradeDiaDebito, ");
            sql.Append("NR_HISCRE_AJUDT_EST = :DayTradeEstornoCredito, ");
            sql.Append("NR_HISDEB_AJUDT_EST = :DayTradeEstornoDebito, ");
            sql.Append("NR_HISCRE_AJUNEG = :AjusteNegocioDiaCredito, ");
            sql.Append("NR_HISDEB_AJUNEG = :AjusteNegocioDiaDebito, ");
            sql.Append("NR_HISCRE_AJUNEG_EST = :AjusteNegocioEstornoCredito, ");
            sql.Append("NR_HISDEB_AJUNEG_EST = :AjusteNegocioEstornoDebito, ");
            sql.Append("NR_HISCRE_AJUPOS = :AjustePosicaoDiaCredito, ");
            sql.Append("NR_HISDEB_AJUPOS = :AjustePosicaoDiaDebito, ");
            sql.Append("NR_HISCRE_AJUPOS_EST = :AjustePosicaoEstornoCredito, ");
            sql.Append("NR_HISDEB_AJUPOS_EST = :AjustePosicaoEstornoDebito, ");
            sql.Append("NR_HISCRE_CORR  = :AgenteDiaCredito, ");
            sql.Append("NR_HISDEB_CORR  = :AgenteDiaDebito, ");
            sql.Append("NR_HISDEB_CORR_EST = :AgenteEstornoDebito, ");
            sql.Append("NR_HISCRE_CORR_EST = :AgenteEstornoCredito, ");
            sql.Append("NR_HISDEB_IROPER = :IrOperacoesDiaDebito, ");
            sql.Append("NR_HISCRE_IROPER_EST = :IrOperacoesEstornoCredito, ");
            sql.Append("NR_HISCRE = :NotaCorretagemDiaCredito, ");
            sql.Append("NR_HISDEB = :NotaCorretagemDiaDebito, ");
            sql.Append("NR_HISDEB_EST = :NotaCorretagemEstornoDebito, ");
            sql.Append("NR_HISCRE_EST = :NotaCorretagemEstornoCredito ");
            sql.Append("WHERE TP_NOTA = :CodigoTipoNota");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, ":DayTradeDiaCredito", DbType.Int32, entity.DayTradeDiaCredito);
                this.DataBase.AddInParameter(command, ":DayTradeDiaDebito", DbType.Int32, entity.DayTradeDiaDebito);
                this.DataBase.AddInParameter(command, ":DayTradeEstornoCredito", DbType.Int32, entity.DayTradeEstornoCredito);
                this.DataBase.AddInParameter(command, ":DayTradeEstornoDebito", DbType.Int32, entity.DayTradeEstornoDebito);
                this.DataBase.AddInParameter(command, ":AjusteNegocioDiaCredito", DbType.Int32, entity.AjusteNegocioDiaCredito);
                this.DataBase.AddInParameter(command, ":AjusteNegocioDiaDebito", DbType.Int32, entity.AjusteNegocioDiaDebito);
                this.DataBase.AddInParameter(command, ":AjusteNegocioEstornoCredito", DbType.Int32, entity.AjusteNegocioEstornoCredito);
                this.DataBase.AddInParameter(command, ":AjusteNegocioEstornoDebito", DbType.Int32, entity.AjusteNegocioEstornoDebito);
                this.DataBase.AddInParameter(command, ":AjustePosicaoDiaCredito", DbType.Int32, entity.AjustePosicaoDiaCredito);
                this.DataBase.AddInParameter(command, ":AjustePosicaoDiaDebito", DbType.Int32, entity.AjustePosicaoDiaDebito);
                this.DataBase.AddInParameter(command, ":AjustePosicaoEstornoCredito", DbType.Int32, entity.AjustePosicaoEstornoCredito);
                this.DataBase.AddInParameter(command, ":AjustePosicaoEstornoDebito", DbType.Int32, entity.AjustePosicaoEstornoDebito);
                this.DataBase.AddInParameter(command, ":AgenteDiaCredito", DbType.Int32, entity.AgenteDiaCredito);
                this.DataBase.AddInParameter(command, ":AgenteDiaDebito", DbType.Int32, entity.AgenteDiaDebito);
                this.DataBase.AddInParameter(command, ":AgenteEstornoDebito", DbType.Int32, entity.AgenteEstornoDebito);
                this.DataBase.AddInParameter(command, ":AgenteEstornoCredito", DbType.Int32, entity.AgenteEstornoCredito);
                this.DataBase.AddInParameter(command, ":IrOperacoesDiaDebito", DbType.Int32, entity.IrOperacoesDiaDebito);
                this.DataBase.AddInParameter(command, ":IrOperacoesEstornoCredito", DbType.Int32, entity.IrOperacoesEstornoCredito);
                this.DataBase.AddInParameter(command, ":NotaCorretagemDiaCredito", DbType.Int32, entity.NotaCorretagemDiaCredito);
                this.DataBase.AddInParameter(command, ":NotaCorretagemDiaDebito", DbType.Int32, entity.NotaCorretagemDiaDebito);
                this.DataBase.AddInParameter(command, ":NotaCorretagemEstornoCredito", DbType.Int32, entity.NotaCorretagemEstornoCredito);
                this.DataBase.AddInParameter(command, ":NotaCorretagemEstornoDebito", DbType.Int32, entity.NotaCorretagemEstornoDebito);
                this.DataBase.AddInParameter(command, ":CodigoTipoNota", DbType.String, entity.CodigoTipoNota);

                this.DataBase.ExecuteNonQuery(command);
            }
    	}

        public List<BusinessEntity.TipoNota> ConsultarTiposNotas(BusinessEntity.Parameter.FiltroTipoNota parameter)
        {
            List<BusinessEntity.TipoNota> listaTiposNotas = new List<BusinessEntity.TipoNota>();

            StringBuilder sql = new StringBuilder();

            sql.Append(@"SELECT TP_NOTA TipoNota, NR_DIAS_LIQD NumeroDiasLiquidacao, DS_TIPO_NOTA DescricaoTipoNota, IN_CPMF Cpmf, ");
            sql.Append(" NR_HISCRE_AJUDT DayTradeDiaCredito, NR_HISDEB_AJUDT DayTradeDiaDebito, ");
            sql.Append(" NR_HISCRE_AJUDT_EST DayTradeEstornoCredito, NR_HISDEB_AJUDT_EST DayTradeEstornoDebito, ");
            sql.Append(" NR_HISCRE_AJUNEG AjusteNegocioDiaCredito, NR_HISDEB_AJUNEG AjusteNegocioDiaDebito, ");
            sql.Append(" NR_HISCRE_AJUNEG_EST AjusteNegocioEstornoCredito, NR_HISDEB_AJUNEG_EST AjusteNegocioEstornoDebito, ");
            sql.Append(" NR_HISCRE_AJUPOS AjustePosicaoDiaCredito, NR_HISDEB_AJUPOS AjustePosicaoDiaDebito, ");
            sql.Append(" NR_HISCRE_AJUPOS_EST AjustePosicaoEstornoCredito, NR_HISDEB_AJUPOS_EST AjustePosicaoEstornoDebito, ");
            sql.Append(" NR_HISCRE_CORR AgenteDiaCredito, NR_HISDEB_CORR AgenteDiaDebito,  ");
            sql.Append(" NR_HISCRE_CORR_EST AgenteEstornoCredito, NR_HISDEB_CORR_EST AgenteEstornoDebito, ");
            sql.Append(" NR_HISDEB_IROPER IrOperacoesDiaDebito, NR_HISCRE_IROPER_EST IrOperacoesEstornoCredito, ");
            sql.Append(" NR_HISCRE NotaCorretagemDiaCredito, NR_HISDEB NotaCorretagemDiaDebito, ");
            sql.Append(" NR_HISDEB_EST NotaCorretagemEstornoDebito, NR_HISCRE_EST NotaCorretagemEstornoCredito ");
            sql.Append(" FROM TBOHIST_INTR_CCOR ");

            if (parameter != null)
            {
                if (parameter.Cpmf != null)
                {
                    if (parameter.Cpmf == true)
                    {
                        sql.Append(" WHERE IN_CPMF = 'S' ");
                    }
                    else
                    {
                        sql.Append(" WHERE IN_CPMF = 'N' ");
                    }
                }
            }

            sql.Append(" ORDER BY NR_DIAS_LIQD, DS_TIPO_NOTA ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                listaTiposNotas = this.FindAll<BusinessEntity.TipoNota>(command, 
                    reader => {
                        
                        BusinessEntity.TipoNota item = new BusinessEntity.TipoNota();

                        item.CodigoTipoNota = reader.GetValue<string>("TipoNota"); 
                        item.DescricaoTipoNota = reader.GetValue<string>("DescricaoTipoNota"); 
                        item.Cpmf = (reader.GetValue<string>("Cpmf")== "S");
                        item.DayTradeDiaCredito =    (reader["DayTradeDiaCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("DayTradeDiaCredito") : null);
                        item.DayTradeDiaDebito  =    (reader["DayTradeDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("DayTradeDiaDebito") : null);
                        item.DayTradeEstornoCredito =(reader["DayTradeEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("DayTradeEstornoCredito") : null);
                        item.DayTradeEstornoDebito = (reader["DayTradeEstornoDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("DayTradeEstornoDebito") : null);
                        item.AjusteNegocioDiaCredito = (reader["AjusteNegocioDiaCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjusteNegocioDiaCredito") : null);
                        item.AjusteNegocioDiaDebito  = (reader["AjusteNegocioDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjusteNegocioDiaDebito") : null);
                        item.NumeroDiasLiquidacao = (reader["NumeroDiasLiquidacao"] != DBNull.Value ? (int?)reader.GetValue<int>("NumeroDiasLiquidacao") : null);
                        
                        item.AjusteNegocioEstornoCredito = (reader["AjusteNegocioEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjusteNegocioEstornoCredito") : null);
                        item.AjusteNegocioEstornoDebito  = (reader["AjusteNegocioEstornoDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjusteNegocioEstornoDebito") : null);
                        item.AjustePosicaoDiaCredito  = (reader["AjustePosicaoDiaCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjustePosicaoDiaCredito") : null);
                        item.AjustePosicaoDiaDebito   = (reader["AjustePosicaoDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjustePosicaoDiaDebito") : null);

                        item.AjustePosicaoEstornoCredito = (reader["AjustePosicaoEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjustePosicaoEstornoCredito") : null);
                        item.AjustePosicaoEstornoDebito  = (reader["AjustePosicaoEstornoDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AjustePosicaoEstornoDebito") : null);
                        item.AgenteDiaCredito = (reader["AgenteDiaCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AgenteDiaCredito") : null);
                        item.AgenteDiaDebito  = (reader["AgenteDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AgenteDiaDebito") : null);
                        item.AgenteEstornoCredito = (reader["AgenteEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("AgenteEstornoCredito") : null);
                        item.AgenteEstornoDebito  = (reader["AgenteEstornoDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("AgenteEstornoDebito") : null);

                        item.IrOperacoesDiaDebito = (reader["IrOperacoesDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("IrOperacoesDiaDebito") : null);
                        item.IrOperacoesEstornoCredito = (reader["IrOperacoesEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("IrOperacoesEstornoCredito") : null);
                        item.NotaCorretagemDiaCredito  = (reader["NotaCorretagemDiaCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("NotaCorretagemDiaCredito") : null);
                        item.NotaCorretagemDiaDebito   = (reader["NotaCorretagemDiaDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("NotaCorretagemDiaDebito") : null);
                        item.NotaCorretagemEstornoCredito = (reader["NotaCorretagemEstornoCredito"] != DBNull.Value ? (int?)reader.GetValue<int>("NotaCorretagemEstornoCredito") : null);
                        item.NotaCorretagemEstornoDebito  = (reader["NotaCorretagemEstornoDebito"] != DBNull.Value ? (int?)reader.GetValue<int>("NotaCorretagemEstornoDebito") : null);

                        return item;
                    }
                );
            }
            return listaTiposNotas;
        }

		public BusinessEntity.ParametroBolsa ObterParametroBolsa()
        {
            BusinessEntity.ParametroBolsa parametro = new BusinessEntity.ParametroBolsa();

            StringBuilder sql = new StringBuilder();

            sql.Append(@"SELECT IN_ZERA_NOTA ZeraNota, NR_NOTA UltimaNotaEmitida, IN_NOTA NumeraNota,  ");
            sql.Append(" IN_GRUPA_NOTA AgrupaNota, IN_BASEIRLIQ BaseLiquido, IN_IRLIQNOT LiquidoNota,  ");
            sql.Append(" IN_CORRESPONDENTE Correspondente, IN_COMISSAO Comissao, IN_IROPER_LIQNOT SemOperacao, ");
            sql.Append(" CD_MENSAGEM Mensagem, DS_CAMINHO_NOTA CaminhoNota, IN_CC IntegraContasCorrentes,  ");
            sql.Append(" IN_CS IntegraCustodia, IN_CT IntegraContabilidade, IND_INTR_TESO IntegraTesouraria, ");
            sql.Append(" IN_INT_AGE_COMP EnviaAgente, IN_CART_PROP EnviaCarteira ");  
            sql.Append(" FROM TBOPARAM ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                parametro = this.FindOne<BusinessEntity.ParametroBolsa>(command, reader =>
                {
                    BusinessEntity.ParametroBolsa entity = new BusinessEntity.ParametroBolsa();

                    //entity.ZeraNota = reader.GetValue<string>("ZeraNota");
                    
                    entity.ZeraNota = Sinacor.Infra.Service.Common.EnumConverter.Parse<BusinessEntity.Enum.TipoPeriodo>(reader.GetValue<string>("ZeraNota"));

                    entity.UltimaNotaEmitida = reader.GetValue<int>("UltimaNotaEmitida");
                    entity.NumeraNota = (reader.GetValue<string>("NumeraNota") == "S");
                    entity.AgrupaNota = (reader.GetValue<string>("AgrupaNota") == "S");
                    entity.BaseLiquido = (reader.GetValue<string>("BaseLiquido") == "S");
                    entity.LiquidoNota = (reader.GetValue<string>("LiquidoNota") == "S");
                    entity.Correspondente = (reader.GetValue<string>("Correspondente") == "S");
                    entity.Comissao = (reader.GetValue<string>("Comissao") == "S");
                    entity.SemOperacao = (reader.GetValue<string>("SemOperacao") == "S");
                    entity.Mensagem = reader.GetValue<int?>("Mensagem");
                    entity.CaminhoNota = reader.GetValue<string>("CaminhoNota");
                    entity.IntegraContasCorrentes = (reader.GetValue<string>("IntegraContasCorrentes") == "S");
                    entity.IntegraCustodia = (reader.GetValue<string>("IntegraCustodia") == "S");
                    entity.IntegraContabilidade = (reader.GetValue<string>("IntegraContabilidade") == "S");
                    entity.IntegraTesouraria = (reader.GetValue<string>("IntegraTesouraria") == "S");
                    entity.EnviaCarteira = (reader.GetValue<string>("EnviaCarteira") == "S");
                    entity.EnviaAgente = (reader.GetValue<string>("EnviaAgente") == "S");

                    return entity;
                }
            );
            }
            return parametro;
		}
	}
}